#ifndef GAME_HPP
#define GAME_HPP
#include "config.hpp"
#include "filter_new.hpp"
#include <array>
#include <memory>
#include <opencv2/opencv.hpp>
#include <vector>
#include <array>

cv::Point2f init_thresholds(cv::Mat &black_roi, cv::Mat &white_roi);

    class Game {
public:
  Game();
  ~Game();

  // 主要处理函数，处理输入图片并返回棋盘状态
  std::array<chessPiece, 9> processImage(const cv::Mat &input);

private:
  
  // 图像预处理：自适应二值化和开运算
  cv::Mat preprocessImage(const cv::Mat &input);

  // 获取棋盘的四个角点
  std::vector<cv::Point2f> findBoardCorners(const cv::Mat &binary);

  // 透视变换
  cv::Mat perspectiveTransform(const cv::Mat &input,
                               const std::vector<cv::Point2f> &corners);

  // 分割棋盘格子
  std::vector<cv::Mat> splitBoard(const cv::Mat &board);

  // 判断单个格子中的棋子类型
  chessPiece determineChessPiece(const cv::Mat &cell);

private:
  // 透视变换后的棋盘大小
  static constexpr int BOARD_SIZE = 300;
  // 用于自适应二值化的块大小
  static constexpr int BLOCK_SIZE = 11;

  std::array<std::shared_ptr<CircularBufferFilter>,4> filter_;

  // 滤波器对象
};

#endif // GAME_HPP
